from flask import Flask
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
from redis import Redis
from config import config_dict
from flask_migrate import Migrate

import pymysql

pymysql.install_as_MySQLdb()

# 将数据库连接对象定义为全局变量, 方便视图函数进行数据库操作
rs = None  # type: # Redis
db = None  # type: SQLAlchemy


# 工厂函数: 由使用者提供物料, 并在函数内部封装对象的创建过程
def create_app(config_type):
    """封装应用的创建和组件的初始化操作"""

    app = Flask(__name__)

    # 根据配置类型取出对应的子类
    config_class = config_dict[config_type]

    # 从对象中加载配置
    app.config.from_object(config_class)

    # 声明全局变量
    global db, rs

    # 创建mysql连接
    db = SQLAlchemy(app)
    # 创建redis连接
    # rs = Redis(host=config_class.REDIS_HOST, port=config_class.REDIS_PORT)

    # 初始化session存储组件
    Session(app)

    # 如果导入内容只使用一次, 可以在使用前再进行导入, 可以减少导入错误的发生
    from info.modules.api import api_blu
    # 注册蓝图对象
    app.register_blueprint(api_blu)

    # 初始化迁移器
    Migrate(app, db)

    # 关联模型文件
    from info.utils import models

    return app
